﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlAzienda
    {
        private Connector Connessione;

        public ctrlAzienda()
        {
            Connessione = Connector.Istance();
        }

        public enum Insert
        {
            ok,
            ko
        }

        public enum Update
        {
            ok,
            ko
        }

        public enum Delete
        {
            ok,
            ko
        }

        public Insert Nuovo(Azienda Azienda)
        {
            Cancella();
            string sql = "";
            if (Azienda.Logo != null)
            {
                sql = @"insert into Azienda (id,ragionesociale,ragionesociale2,indirizzo,cap,citta,provincia,codicefiscale,partitaiva,telefono1,telefono2,email1,email2,sitoweb,logo)
                values(@id,@ragionesociale,@ragionesociale2,@indirizzo,@cap,@citta,@provincia,@codicefiscale,@partitaiva,@telefono1,@telefono2,@email1,@email2,@sitoweb,@logo)";
            }
            else
            {
                sql = @"insert into Azienda (id,ragionesociale,ragionesociale2,indirizzo,cap,citta,provincia,codicefiscale,partitaiva,telefono1,telefono2,email1,email2,sitoweb)
                values(@id,@ragionesociale,@ragionesociale2,@indirizzo,@cap,@citta,@provincia,@codicefiscale,@partitaiva,@telefono1,@telefono2,@email1,@email2,@sitoweb)";
            }

            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            cmd.Parameters.AddWithValue("@id", (Guid)Azienda.Id);
            cmd.Parameters.AddWithValue("@ragionesociale", Azienda.RagioneSociale);
            cmd.Parameters.AddWithValue("@ragionesociale2", Azienda.RagioneSociale2);
            cmd.Parameters.AddWithValue("@indirizzo", Azienda.Indirizzo);
            cmd.Parameters.AddWithValue("@cap", Azienda.Cap);
            cmd.Parameters.AddWithValue("@citta", Azienda.Citta);
            cmd.Parameters.AddWithValue("@provincia", Azienda.Provincia);
            cmd.Parameters.AddWithValue("@codicefiscale", Azienda.CodiceFiscale);
            cmd.Parameters.AddWithValue("@partitaiva", Azienda.PartitaIva);
            cmd.Parameters.AddWithValue("@telefono1", Azienda.Telefono1);
            cmd.Parameters.AddWithValue("@telefono2", Azienda.Telefono2);
            cmd.Parameters.AddWithValue("@email1", Azienda.Email1);
            cmd.Parameters.AddWithValue("@email2", Azienda.Email2);
            cmd.Parameters.AddWithValue("@sitoweb", Azienda.SitoWeb);

            if (Azienda.Logo != null)
            {
                byte[] picbyte = CaricaImmagine(Azienda.Logo);
                cmd.Parameters.AddWithValue("@logo", picbyte);
            }

            if (cmd.ExecuteNonQuery() > 0)
                return Insert.ok;
            else
                return Insert.ko;
        }

        public Update CaricaLogo(Azienda Azienda, string fileImmagine)
        {
            byte[] picbyte = CaricaImmagine(fileImmagine);

            string sql = @"update Azienda set
                logo=@logo
                where id=@id";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);

            SqlParameter logo = new SqlParameter();
            logo.SqlDbType = SqlDbType.Image;
            logo.ParameterName = "@logo";
            logo.Value = picbyte;
            cmd.Parameters.Add(logo);

            SqlParameter id = new SqlParameter();
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.ParameterName = "@id";
            id.Value = Azienda.Id;
            cmd.Parameters.Add(id);

            if (cmd.ExecuteNonQuery() > 0)
                return Update.ok;
            else
                return Update.ko;
        }

        private byte[] CaricaImmagine(string fileImmagine)
        {
            if (!File.Exists(fileImmagine)) { throw new FileImmagineNonEsistente(); }

            FileStream fs;
            fs = new FileStream(fileImmagine, FileMode.Open, FileAccess.Read);
            byte[] picbyte = new byte[fs.Length];
            fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
            fs.Close();
            return picbyte;
        }

        private Delete Cancella()
        {
            string sql = "delete from Azienda";
            SqlCommand cmd = new SqlCommand(sql, Connessione.Connessione);
            if (cmd.ExecuteNonQuery() > 0)
                return Delete.ok;
            else
                return Delete.ko;
        }

        public MemoryStream GetLogo()
        {
            string sql = "select top 1 logo from Azienda";
            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            if (dt.Rows.Count == 1)
            {
                if (dt.Rows[0]["logo"] != DBNull.Value)
                {
                    byte[] pic = (byte[])dt.Rows[0]["logo"];
                    MemoryStream file = new MemoryStream(pic);
                    return file;
                }
            }
            return null;
        }

        public Azienda Seleziona()
        {
            string sql = "select top 1 * from Azienda";
            SqlDataAdapter com = new SqlDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count == 0) { return null; }
            Azienda Azienda = new Azienda();
            foreach (DataRow item in dt.Rows)
            {
                Azienda.Id = (Guid)item["Id"];
                Azienda.RagioneSociale = item["ragionesociale"].ToString();
                Azienda.RagioneSociale2 = item["ragionesociale2"].ToString();
                Azienda.Indirizzo = item["indirizzo"].ToString();
                Azienda.Cap = item["cap"].ToString();
                Azienda.Citta = item["citta"].ToString();
                Azienda.Provincia = item["provincia"].ToString();
                Azienda.CodiceFiscale = item["codicefiscale"].ToString();
                Azienda.PartitaIva = item["partitaiva"].ToString();
                Azienda.Telefono1 = item["telefono1"].ToString();
                Azienda.Telefono2 = item["telefono2"].ToString();
                Azienda.Email1 = item["email1"].ToString();
                Azienda.Email2 = item["email2"].ToString();
                Azienda.SitoWeb = item["sitoweb"].ToString();
            }
            return Azienda;
        }
    }
}